/*     */ package com.zimbra.cs.index;
/*     */ 
/*     */ import com.zimbra.common.service.ServiceException;
/*     */ import com.zimbra.cs.mailbox.MailItem.Type;
/*     */ import com.zimbra.cs.mailbox.Mailbox;
/*     */ import java.util.Set;
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ public abstract class QueryOperation
/*     */   implements Cloneable, ZimbraQueryResults
/*     */ {
/*     */   static final int MIN_CHUNK_SIZE = 26;
/*     */   static final int MAX_CHUNK_SIZE = 5000;
/*     */   protected QueryContext context;
/*     */   private static final float MESSAGES_PER_CONV_ESTIMATE = 2.25F;
/*     */   private boolean mIsToplevelQueryOp;
/*     */   
/*     */   public SortBy getSortBy()
/*     */   {
/*  47 */     return this.context.getParams().getSortBy();
/*     */   }
/*     */   
/*     */   public boolean isPreSorted()
/*     */   {
/*  52 */     return false;
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */   private static enum Grouping
/*     */   {
/*  74 */     CONVERSATION,  MESSAGE,  ITEM;
/*     */     
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */     private Grouping() {}
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */   final ZimbraQueryResults run(Mailbox mbox, SearchParams params, int chunkSize)
/*     */     throws ServiceException
/*     */   {
/*  89 */     this.mIsToplevelQueryOp = true;
/*     */     
/*  91 */     chunkSize++;
/*     */     
/*  93 */     if (chunkSize < 26) {
/*  94 */       chunkSize = 26;
/*  95 */     } else if (chunkSize > 5000) {
/*  96 */       chunkSize = 5000;
/*     */     }
/*     */     
/*  99 */     Grouping retType = Grouping.ITEM;
/* 100 */     Set<MailItem.Type> types = params.getTypes();
/* 101 */     if (types.contains(MailItem.Type.CONVERSATION)) {
/* 102 */       retType = Grouping.CONVERSATION;
/* 103 */     } else if (types.contains(MailItem.Type.MESSAGE)) {
/* 104 */       retType = Grouping.MESSAGE;
/*     */     }
/*     */     
/*     */ 
/* 108 */     boolean preloadOuterResults = false;
/*     */     
/* 110 */     int outerChunkSize = chunkSize;
/*     */     
/* 112 */     boolean usePreloadingGrouper = true;
/*     */     
/*     */ 
/* 115 */     if (params.getFetchMode() == SearchParams.Fetch.IDS) {
/* 116 */       usePreloadingGrouper = false;
/*     */     }
/*     */     
/* 119 */     ZimbraQueryResultsImpl results = null;
/* 120 */     switch (retType) {
/*     */     case CONVERSATION: 
/* 122 */       if ((params.getPrefetch()) && (usePreloadingGrouper)) {
/* 123 */         chunkSize += 2;
/* 124 */         results = new ConvQueryResults(new ItemPreloadingGrouper(this, chunkSize, mbox, params.inDumpster()), types, params.getSortBy(), params.getFetchMode());
/*     */         
/* 126 */         chunkSize = (int)(chunkSize * 2.25F);
/*     */       } else {
/* 128 */         chunkSize++;
/* 129 */         results = new ConvQueryResults(this, types, params.getSortBy(), params.getFetchMode());
/* 130 */         chunkSize = (int)(chunkSize * 2.25F);
/*     */       }
/* 132 */       preloadOuterResults = true;
/* 133 */       break;
/*     */     case MESSAGE: 
/* 135 */       if ((params.getPrefetch()) && (usePreloadingGrouper)) {
/* 136 */         chunkSize += 2;
/* 137 */         results = new MsgQueryResults(new ItemPreloadingGrouper(this, chunkSize, mbox, params.inDumpster()), types, params.getSortBy(), params.getFetchMode());
/*     */       }
/*     */       else {
/* 140 */         chunkSize++;
/* 141 */         results = new MsgQueryResults(this, types, params.getSortBy(), params.getFetchMode());
/*     */       }
/* 143 */       break;
/*     */     case ITEM: 
/* 145 */       if ((params.getPrefetch()) && (usePreloadingGrouper)) {
/* 146 */         chunkSize++;
/* 147 */         results = new UngroupedQueryResults(new ItemPreloadingGrouper(this, chunkSize, mbox, params.inDumpster()), types, params.getSortBy(), params.getFetchMode());
/*     */       }
/*     */       else {
/* 150 */         results = new UngroupedQueryResults(this, types, params.getSortBy(), params.getFetchMode());
/*     */       }
/* 152 */       break;
/*     */     default: 
/* 154 */       if (!$assertionsDisabled) throw new AssertionError();
/*     */       break;
/*     */     }
/* 157 */     begin(new QueryContext(mbox, results, params, chunkSize));
/*     */     
/* 159 */     if ((usePreloadingGrouper) && (preloadOuterResults) && (params.getPrefetch())) {
/* 160 */       return new ItemPreloadingGrouper(results, outerChunkSize, mbox, params.inDumpster());
/*     */     }
/* 162 */     return results;
/*     */   }
/*     */   
/*     */   public boolean hasNext()
/*     */     throws ServiceException
/*     */   {
/* 168 */     return peekNext() != null;
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */   public ZimbraHit skipToHit(int hitNo)
/*     */     throws ServiceException
/*     */   {
/* 186 */     resetIterator();
/* 187 */     for (int i = 0; i < hitNo; i++) {
/* 188 */       if (!hasNext()) {
/* 189 */         return null;
/*     */       }
/* 191 */       getNext();
/*     */     }
/* 193 */     return getNext();
/*     */   }
/*     */   
/*     */ 
/*     */   public Object clone()
/*     */   {
/*     */     try
/*     */     {
/* 201 */       return super.clone();
/*     */     } catch (CloneNotSupportedException e) {
/* 203 */       if (!$assertionsDisabled) throw new AssertionError();
/*     */     }
/* 205 */     return null;
/*     */   }
/*     */   
/* 208 */   public QueryOperation() { this.mIsToplevelQueryOp = false; }
/*     */   
/* 210 */   protected boolean isTopLevelQueryOp() { return this.mIsToplevelQueryOp; }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */   abstract String toQueryString();
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */   protected abstract void begin(QueryContext paramQueryContext)
/*     */     throws ServiceException;
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */   abstract Set<QueryTarget> getQueryTargets();
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */   abstract QueryOperation ensureSpamTrashSetting(Mailbox paramMailbox, boolean paramBoolean1, boolean paramBoolean2)
/*     */     throws ServiceException;
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */   abstract boolean hasSpamTrashSetting();
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */   abstract void forceHasSpamTrashSetting();
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */   abstract boolean hasNoResults();
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */   abstract boolean hasAllResults();
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */   abstract QueryOperation expandLocalRemotePart(Mailbox paramMailbox)
/*     */     throws ServiceException;
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */   abstract QueryOperation optimize(Mailbox paramMailbox)
/*     */     throws ServiceException;
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */   protected abstract QueryOperation combineOps(QueryOperation paramQueryOperation, boolean paramBoolean);
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */   protected abstract void depthFirstRecurse(RecurseCallback paramRecurseCallback);
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */   static abstract interface RecurseCallback
/*     */   {
/*     */     public abstract void recurseCallback(QueryOperation paramQueryOperation);
/*     */   }
/*     */   
/*     */ 
/*     */ 
/*     */ 
/*     */   protected static final class QueryContext
/*     */   {
/*     */     private final Mailbox mailbox;
/*     */     
/*     */ 
/*     */     private final ZimbraQueryResultsImpl results;
/*     */     
/*     */ 
/*     */     private final SearchParams params;
/*     */     
/*     */ 
/*     */     private final int chunkSize;
/*     */     
/*     */ 
/*     */ 
/*     */     QueryContext(Mailbox mbox, ZimbraQueryResultsImpl results, SearchParams params, int chunkSize)
/*     */     {
/* 304 */       this.mailbox = mbox;
/* 305 */       this.results = results;
/* 306 */       this.params = params;
/* 307 */       this.chunkSize = chunkSize;
/*     */     }
/*     */     
/*     */     Mailbox getMailbox() {
/* 311 */       return this.mailbox;
/*     */     }
/*     */     
/*     */     ZimbraQueryResultsImpl getResults() {
/* 315 */       return this.results;
/*     */     }
/*     */     
/*     */     SearchParams getParams() {
/* 319 */       return this.params;
/*     */     }
/*     */     
/*     */     int getChunkSize() {
/* 323 */       return this.chunkSize;
/*     */     }
/*     */   }
/*     */ }


/* Location:              /home/mint/zimbrastore.jar!/com/zimbra/cs/index/QueryOperation.class
 * Java compiler version: 7 (51.0)
 * JD-Core Version:       0.7.1
 */